﻿using System;
using System.ComponentModel;
using GalaSoft.MvvmLight;
using IssueVision.Data.Web;

namespace IssueVision.Common
{
    public interface IIssueVisionModel : INotifyPropertyChanged, ICleanup
    {
        void GetIssueTypesAsync();
        event EventHandler<EntityResultsArgs<IssueType>> GetIssueTypesComplete;
        void GetPlatformsAsync();
        event EventHandler<EntityResultsArgs<Platform>> GetPlatformsComplete;
        void GetResolutionsAsync();
        event EventHandler<EntityResultsArgs<Resolution>> GetResolutionsComplete;
        void GetStatusesAsync();
        event EventHandler<EntityResultsArgs<Status>> GetStatusesComplete;
        void GetSubStatusesAsync();
        event EventHandler<EntityResultsArgs<SubStatus>> GetSubStatusesComplete;
        void GetUsersAsync();
        event EventHandler<EntityResultsArgs<User>> GetUsersComplete;
        void GetCurrentUserAsync();
        event EventHandler<EntityResultsArgs<User>> GetCurrentUserComplete;
        void GetSecurityQuestionsAsync();
        event EventHandler<EntityResultsArgs<SecurityQuestion>> GetSecurityQuestionsComplete;
        void GetMyIssuesAsync();
        event EventHandler<EntityResultsArgs<Issue>> GetMyIssuesComplete;
        void GetAllIssuesAsync();
        event EventHandler<EntityResultsArgs<Issue>> GetAllIssuesComplete;
        void GetAllUnresolvedIssuesAsync();
        event EventHandler<EntityResultsArgs<Issue>> GetAllUnresolvedIssuesComplete;

        void GetActiveBugCountByMonthAsync(Int32 numberOfMonth);
        event EventHandler<InvokeOperationEventArgs> GetActiveBugCountByMonthComplete;
        void GetResolvedBugCountByMonthAsync(Int32 numberOfMonth);
        event EventHandler<InvokeOperationEventArgs> GetResolvedBugCountByMonthComplete;
        void GetActiveBugCountByPriorityAsync();
        event EventHandler<InvokeOperationEventArgs> GetActiveBugCountByPriorityComplete;

        Issue AddNewIssue();

        void RemoveAttribute(Data.Web.Attribute attribute);
        void RemoveFile(File file);

        void SaveChangesAsync();
        event EventHandler<SubmitOperationEventArgs> SaveChangesComplete;
        void RejectChanges();

        Boolean HasChanges { get; }
        Boolean IsBusy { get; }
    }
}